<?php

require_once __DIR__ . '/../../../vendor/autoload.php';

use JLPay\Core\OrgConfig;
use JLPay\Core\DemoConfig;
use JLPay\Services\Trans\C2b\QrcodePayService;
use JLPay\Models\Trans\C2b\QrcodePayRequest;
use JLPay\Models\Trans\C2b\QrcodePayResponse;
use JLPay\Models\Trans\Dto\GoodsDataDto;
use JLPay\Models\Trans\Dto\TerminalInfoDto;
use JLPay\Utils\Logger;
use JLPay\Utils\DemoRequestHandler;

/**
 * 交易 - C2B二维码支付功能使用示例
 */

// =================== 常量定义 =====================
// 支付类型常量
const PAY_TYPE_WECHAT = "wxpay";  // 微信支付
const PAY_TYPE_ALIPAY = "alipay";  // 支付宝支付
const PAY_TYPE_UNION = "unionpay";  // 银联支付

// 限制支付方式常量
const LIMIT_PAY_NO_CREDIT = "no_credit";  // 不能使用信用卡
const LIMIT_PAY_CREDIT_ONLY = "credit";  // 只能使用信用卡

// 分期标识常量
const HIRE_PURCHASE_NO = "0";  // 不分期
const HIRE_PURCHASE_YES = "1";  // 分期

// 终端类型常量
const TERMINAL_TYPE_POS = "01";  // POS终端
const TERMINAL_TYPE_MOBILE = "02";  // 移动终端
const TERMINAL_TYPE_WEB = "03";  // 网页终端

// =================== 工具函数 =====================
/**
 * 创建配置对象
 */
function createConfig(): OrgConfig
{
    return DemoConfig::createConfig();
}

/**
 * 构建商品详情数据
 */
function buildGoodsData(): GoodsDataDto
{
    $goodsData = new GoodsDataDto();

    return $goodsData;
}

/**
 * 构建终端信息
 */
function buildTerminalInfo(): TerminalInfoDto
{
    $terminalInfo = new TerminalInfoDto();

    return $terminalInfo;
}

/**
 * 构建二维码支付请求
 */
function buildQrcodePayRequest(): QrcodePayRequest
{
    $request = new QrcodePayRequest();
    
    // 设置请求参数
    $request->setMchId("849584358120018");
    $request->setTermNo("60131234");
    $request->setPayType(PAY_TYPE_WECHAT);
    $request->setOutTradeNo("ld201911023465530");
    $request->setPaymentValidTime("10");
    $request->setBody("充值中心-会员充值");
    $request->setAttach("商城—-易拉宝10个打印纸20箱");
    $request->setTotalFee("100");
    $request->setLimitPay(LIMIT_PAY_NO_CREDIT);
    $request->setIsHirePurchase(HIRE_PURCHASE_NO);
    $request->setHirePurchaseNum("3");
    $request->setHirePurchaseSellerPercent("0");
    $request->setRemark("该订单物流请走顺丰快递");
    $request->setNotifyUrl("https://example.com/notify");
    $request->setOpUserId("001");
    $request->setOpShopId("GD_SZ_001");
    $request->setDeviceInfo("N50007A8890");
    $request->setMchCreateIp("123.12.12.123");
    $request->setLongitude("116.078631");
    $request->setLatitude("39.71274");
    $request->setSubAppid("wxid_129752pfasf1671");
    $request->setGoodsTag("sz001");
    
    // 设置商品详情
    $goodsData = buildGoodsData();
    $request->setGoodsData($goodsData);
    
    // 设置终端信息
    $terminalInfo = buildTerminalInfo();
    $request->setTerminalInfo($terminalInfo);
    
    return $request;
}

// =================== 示例函数 =====================
/**
 * 二维码支付示例
 */
function qrcodePayDemo(): void
{
    $logger = Logger::getInstance();
    $logger->info("开始执行二维码支付示例");
    
    // 创建配置对象和二维码支付服务
    $config = createConfig();
    $qrcodePayService = new QrcodePayService($config);
    
    // 创建二维码支付请求
    $request = buildQrcodePayRequest();
    
    // 发送请求 - 使用DemoRequestHandler
    $response = DemoRequestHandler::sendRequestAndHandleResponse(
        $qrcodePayService, 
        $request, 
        "二维码支付",
        function($service, $request) {
            return $service->qrcodePay($request);
        }
    );
    
    // 处理响应结果
    if ($response && $response->isSuccess()) {
        $logger->info("响应报文：" . json_encode($response->toArray(), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
    }
    
    $logger->info("二维码支付示例执行完毕");
}

// =================== 主程序 =====================
$logger = Logger::getInstance();

$logger->info("=" . str_repeat("=", 50));
$logger->info("===== 二维码支付示例 开始 =====");
$logger->info("=" . str_repeat("=", 50));

qrcodePayDemo();

$logger->info("=" . str_repeat("=", 50));
$logger->info("===== 二维码支付示例执行完毕 =====");
$logger->info("=" . str_repeat("=", 50)); 